# 当我们使用 if...elif...elif...else 判断时，会写很长的有一串代码，可读性差
# 这是 match 语句会显得更清晰
score = 'B'
if score == 'A':
    print('score is A')
elif score == 'B':
    print('score is B')
elif score == 'C':
    print('score is C')
else:
    print('invalid score')

# 使用 match 写法
match score:
    case 'A':
        print('score is A')
    case 'B':
        print('score is B')
    case 'C':
        print('score is C')
    case _: # _ 表示匹配到其他任意情况
        print('invalid score')

"""
match 语句除了可以匹配简单的单个值
还可以匹配多个值，匹配一定范围
并且把匹配后的值绑定到变量
"""
age = 15

match age:
    case x if x < 10:
        print(f'< 10 years old: {x}')
    case 10:
        print('10 years old.')
    case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18:
        print('11~18 years old.')
    case 19:
        print('19 years old.')
    case _:
        print('not sure.')


# 匹配列表
args = ['gcc', 'hello.c', 'world.c']
# args = ['clean']
# args = ['gcc']
match args:
    # 如果仅出现gcc, 报错
    case ['gcc']:
        print('gcc: missing source file(s).')
    # 出现gcc, 且至少指定一个文件
    case ['gcc', file1, *files]:
        print('gcc compile: ' + file1 + ' ' + ' '.join(files))
    # 仅出现clean
    case ['clean']:
        print('clean')
    case _:
        print('invalid command.')
"""
第一个case ['gcc']表示列表仅有'gcc'一个字符串，没有指定文件名，报错；

第二个case ['gcc', file1, *files]表示列表第一个字符串是'gcc'，第二个字符串绑定到变量file1，后面的任意个字符串绑定到*files（符号*的作用将在函数的参数中讲解），它实际上表示至少指定一个文件；

第三个case ['clean']表示列表仅有'clean'一个字符串；

最后一个case _表示其他所有情况。

可见，match语句的匹配规则非常灵活，可以写出非常简洁的代码。
"""